作者:拍友2502882315 | 来源:互联网 | 2023-10-12 16:39
篇首语:本文由编程笔记#小编为大家整理,主要介绍了matlab 信号的频域分析相关的知识,希望对你有一定的参考价值。
%画出频率为100Hz和300Hz的复合正弦波
Fs=5120;N=1024;
dt=1.0/5120;T=dt*N;
t=linspace(0, T, N);
x=10*sin(2*pi* 100 *t) + 10/3*sin(2*pi* 3*100 *t);
plot(t, x);
%对复合正弦波进行傅里叶变换,得到一个复数
y=fft(x, N);
a=real(y);b=imag(y);%a为y的实部,b为y的虚部
figure;
subplot(2, 1, 1);plot(a);
subplot(2, 1, 2);plot(b);
%A1为y的幅值,Q1为y的相位
A1=abs(y);
Q1=angle(y)*180/pi;%算出弧度,角度是angle(y),角度变弧度需要 *180/pi
figure;
subplot(2, 1, 1);plot(A1);
subplot(2, 1, 2);plot(Q1);
下面是频率为100Hz和300Hz的复合正弦波
傅里叶变换后的实部(上图)和虚部(下图)图
傅里叶变换后的幅值图(上图)和相位图(下图)
实际上,上面的幅值和相位图存在问题
问题1:显示了负频率部分
问题2:X坐标不是频率
问题3:幅值量纲未还原,幅值应该是 10,10/3
更改后的代码
%A1=abs(y);Q1=angle(y)*180/pi;
%figure;
%subplot(2, 1, 1);plot(A1);
%subplot(2, 1, 2);plot(Q1);%算出弧度,角度是angle(y),角度变弧度需要 *180/pi
f=linspace(0, Fs/2, N/2);%定义X坐标为频率,且频率的范围是[0, Fs/2]
A1=abs(y)/(N/2);%还原幅值的量纲,使它最终变为 10,10/3
Q1=angle(y)*180/pi;%算出弧度,角度是angle(y),角度变弧度需要 *180/pi
figure;
subplot(2, 1, 1);
plot(f, A1(1:N/2));
subplot(2, 1, 2);
plot(f, Q1(1:N/2));
在之前的代码的基础上增加功率谱和对数功率谱图
功率谱就是对幅值进行平方
对数功率谱是对功率谱进行取对数运算
A2=A1.^2;%功率谱
P2=20*log10(A2);%对数功率谱,dB=20*log(P)
figure;
subplot(2, 1, 1);
plot(f, A2(1:N/2));%只画数组A2的[1,N/2]部分
subplot(2, 1, 2);
plot(f, P2(1:N/2));%只画数组P2的[1,N/2]部分
功率谱是上图,对数功率谱是下图,对数功率谱可以更加明显地看出来功率谱中幅值比较小地部分。
下面是方波信号的功率谱和对数功率谱,可以非常明显的体会到为什么使用对数功率谱。